package cn.tedu.jdbc;

import java.sql.*;
import java.util.ResourceBundle;

public class JDBCTest01 {
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;

        // 加载数据库配置资源文件(jdbc.properties)
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");

        // 从资源文件中获取数据库驱动程序名称
        String driver = bundle.getString("driver");
        // 从资源文件中获取数据库连接URL
        String url = bundle.getString("url");
        // 从资源文件中获取数据库用户名
        String user = bundle.getString("user");
        // 从资源文件中获取数据库密码
        String password = bundle.getString("password");
        try {
            //1.注册驱动
            //com.mysql.cj.jdbc.Driver是MySQL最核心的驱动类。
            //这个类实现了java。sale.Driver接口，所以，只要导入mysql的驱动包，
            //java.sql.Driver为接口    new com.mysql.cj.jdbc.Driver为实现类
           /* Driver driver = new com.mysql.cj.jdbc.Driver();//创建核心驱动对象
            DriverManager.registerDriver(driver);//注册驱动*/
            Class.forName(driver);
            //DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
            //2.获取链接
           /* String url = "jdbc:mysql://localhost:3306/jdbc";
            String user = "root";
            String password = "root";*/
            conn = DriverManager.getConnection(url, user, password);
            //connection =com.mysql.cj.jdbc.ConnectionImpl@25bbf683
            //解释：com.mysql.cj.jdbc.ConnectionImpl，这是什么？
            //MySQL数据库厂家对java.sql.Connection接口的实现
            //java.sql.Connection接口是sun制定的接口。
            //com.mysql.cj.jdbc.ConnectionImpl是该接口的实现类
            //注意：我们不需要关心具体的实现类是谁，我们只需要面向JDBC接口编写代码即可。
            System.out.println("connection =" + conn);


            //3.获取数据库操作对象
            stmt = conn.createStatement();
            System.out.println("statement =" + stmt);

            //4.执行SQL语句
            //增
            String sql = "insert into t_user(name,password,realname,gender,tel)" +
                    "values('wangwu','123','王五','女','123456789')";
            //返回值的含义：当sql语句是一个DQL语句的时候，并且查询到了结果，返回true。
            // 当sql语句是dml语句或者没有查询到任何结果的时候，返回false。
            // 这个方法功能比较广泛（不够专业），适合所有的SQL语句，很少用。

            // 凡是执行dml语句(insert delete udpate)，建议直接使用 executeUpdate 方法。
            /*boolean isSuccess = statement.execute(sql);
            System.out.println(isSuccess ? "插入失败" : "插入成功");*/
            int count = stmt.executeUpdate(sql);
            System.out.println(count == 1 ? "插入成功" : "插入失败");
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            //6.释放资源
            // 原则：从小到大按照这个顺序关闭。
            // 关闭前最好判断一下是否为空zl
            // 分别对其进行try..catch
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
